package set_;

import java.util.HashSet;
import java.util.Objects;

/**
 * @author DCSGO
 * @version 1.0
 */
public class HashSet_ {
    @SuppressWarnings({"all"})

    public static void main(String[] args) {
        //HashSet 底层是 HashMap
        //add 方法会返回一个 boolean 值
        //true 代表添加成功 false 代表添加失败
        HashSet hashSet = new HashSet();
        System.out.println(hashSet.add("csgo"));//true
        System.out.println(hashSet.add("csgo"));//false
        System.out.println(hashSet);//[csgo]

        System.out.println(hashSet.add(new Dog("hih")));//true
        System.out.println(hashSet.add(new Dog("hih")));//true
        System.out.println(hashSet);//[csgo, Dog{name='hih'}, Dog{name='hih'}]

        System.out.println(hashSet.add(new String("cs")));//true
        System.out.println(hashSet.add(new String("cs")));//false
        System.out.println(hashSet);//[cs, csgo, Dog{name='hih'}, Dog{name='hih'}]

        //HashSet(HashMap) 的 add 方法在添加元素时 若发生冲突(碰撞 两个元素的 hash 值相同)
        //将会调用其对应的 equals 方法 若 equals 返回 true 即两元素"相同"则不进行添加 返回 false
        //反之 添加 并返回 true

        //HashSet 是 数组 + 链表 的数据结构 当某条链表的节点个数大于等于8后 数组会进行扩容(初始是16)
        //每次扩原来大小的两倍 当元素个数(size)到达阈值(threshold) 数组也会扩容
        //static final float DEFAULT_LOAD_FACTOR = 0.75f;
        //threshold = DEFAULT_LOAD_FACTOR * size;
        //当数组大小大于等于64且有一链表的节点个数大于8后将会把当前链表树化(红黑树)
    }
}

class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }

/*    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dog dog = (Dog) o;
        return Objects.equals(name, dog.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }*/

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                '}';
    }
}
